package config

import (
	"log"

	"code_gen/task"
)

var Cfg *AppConfig

func init() {
	cl := &Loader[AppConfig]{}
	Cfg = cl.Init()
	// 加载定时任务
	err := task.NewTaskWithCronAndCmd("0/5 * * * * ?", func(t *task.Task) {
		cl.refresh()
		Cfg = cl.Get()
	}).StartTask()
	if err != nil {
		log.Fatal(err)
	}
}

type AppConfig struct {
	AppName  string           `yaml:"appName" json:"appName"`
	Projects []*ProjectConfig `yaml:"project" json:"project"`
}

type ProjectConfig struct {
	Id          string                 `yaml:"id" json:"id"`
	Name        string                 `yaml:"name" json:"name"`
	DataSource  *DataSource            `yaml:"dataSource" json:"dataSource"`
	Template    *Template              `yaml:"template" json:"template"`
	Ext         map[string]interface{} `yaml:"ext" json:"ext"`
	DataTypeMap []*DataTypeMap         `yaml:"dataTypeMap" json:"dataTypeMap"`
}

type DataTypeMap struct {
	Dialect      string `yaml:"dialect" json:"dialect"`
	Lang         string `yaml:"lang" json:"lang"`
	DbDataType   string `yaml:"dbDataType" json:"dbDataType"`
	LangDataType string `yaml:"langDataType" json:"langDataType"`
	LangPackage  string `yaml:"langPackage" json:"langPackage"`
}

type DataSource struct {
	Type     string `yaml:"type" json:"type"`       // db、sql 两种类型 数据库和sql建表语句
	Dialect  string `yaml:"dialect" json:"dialect"` // 数据库类型
	Lang     string `yaml:"lang" json:"lang"`       // 语言类型
	Host     string `yaml:"host" json:"host"`       // 数据库地址
	Port     int    `yaml:"port" json:"port"`
	DataBase string `yaml:"dataBase" json:"dataBase"`
	User     string `yaml:"user" json:"user"`
	Password string `yaml:"password" json:"password"`
	Params   string `json:"params" json:"params"`
}

type Template struct {
	Author string                 `yaml:"author"` // 作者
	Tables []string               `yaml:"tables"` // 表名或建表语句
	Vars   map[string]interface{} `yaml:"vars"`   // 自定义模板变量
	Output string                 `yaml:"output"` // 输出目录
	Files  []*TemplateFile        `yaml:"files"`  // 模板文件
}

type TemplateFile struct {
	Name    string                 `yaml:"name"`    // 模板文件名
	Content string                 `yaml:"content"` // 模板文件内容
	Path    string                 `yaml:"path"`    // 模板文件路径
	Output  string                 `yaml:"output"`  // 输出文件路径
	Order   int                    `yaml:"order"`   // 执行顺序
	Suffix  string                 `yaml:"suffix"`  // 输出文件后缀
	Package string                 `yaml:"package"` // 输出文件包名
	Type    string                 `yaml:"type"`    // 输出文件类型
	Ext     map[string]interface{} `yaml:"ext"`     // 模板文件扩展
}

type TemplateFileOrder []*TemplateFile

func (t TemplateFileOrder) Len() int {
	return len(t)
}

func (t TemplateFileOrder) Less(i, j int) bool {
	return t[i].Order < t[j].Order
}

func (t TemplateFileOrder) Swap(i, j int) {
	t[i], t[j] = t[j], t[i]
}
